package com.itheima.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.common.BaseContext;
import com.itheima.common.CustomException;
import com.itheima.common.R;
import com.itheima.pojo.ShoppingCart;
import com.itheima.service.ShoppingCartService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

// 购物车数据
@Slf4j
@RestController
@RequestMapping("/shoppingCart")
public class ShoppingCartController {
    // 购物车需要实现的功能 : -> 1.添加购物车 -> 2.查看购物车 -> 3.清空购物车

    @Autowired
    private ShoppingCartService shoppingCartService;

    // 1.添加购物车
    @PostMapping("/add")
    public R<ShoppingCart> add(@RequestBody ShoppingCart shoppingCart){
        log.info("购物车数据: {}",shoppingCart);

        //1 获取当前用户的Id信息 -> 指定当前是哪位用户的购物车数据
        Long currentId = BaseContext.getCurrentId();
        shoppingCart.setUserId(currentId);

        //2 获取购物车中的菜品id
        Long dishId = shoppingCart.getDishId();

        //3 创建添加构造器,添加查询条件 -> 对添加到购物车的信息进行判断
        LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(ShoppingCart::getUserId,currentId);
        //  判断添加到购物车的是套餐还是菜品
        if (dishId == null){
            // 添加的是套餐
            wrapper.eq(ShoppingCart::getSetmealId,shoppingCart.getSetmealId());
        } else {
            // 添加的是菜品
            wrapper.eq(ShoppingCart::getDishId,dishId);
        }

        //4 查询当前添加的菜品或套餐是否已经存在于购物车中
        ShoppingCart one = shoppingCartService.getOne(wrapper);
        //  若已在购物车中,则在原有的数量上+1 -> 若未在购物车,则直接添加,数量默认为1
        if (one != null){
            // 已在购物车中
            Integer number = one.getNumber();
            one.setNumber(number + 1);
            // 调用方法 根据id完成更新/修改
            shoppingCartService.updateById(one);
        } else {
            // 未添加购物车 -> 直接添加,数量默认为1
            shoppingCart.setNumber(1);
            // 添加入购物车的时间为当前日期
            shoppingCart.setCreateTime(LocalDateTime.now());
            // 调用方法,添加入购物车
            shoppingCartService.save(shoppingCart);
            one = shoppingCart;
        }
        // 返回结果
        return R.success(one);
    }

    // 2.查看购物车
    @GetMapping("/list")
    public R<List<ShoppingCart>> list(){
        log.info("查看购物车...");

        //1 创建条件构造器
        LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();

        //2 添加查询条件 -> 条件: 根据当前登录的用户id进行查询
        wrapper.eq(ShoppingCart::getUserId,BaseContext.getCurrentId());

        //3 添加排序添加 -> 条件: 按照添加时间进行升序排列
        wrapper.orderByAsc(ShoppingCart::getCreateTime);

        //4 调用业务层方法完成查询
        List<ShoppingCart> list = shoppingCartService.list(wrapper);

        //5 返回结果
        return R.success(list);
    }

    // 清空购物车
    @DeleteMapping("/clean")
    public R<String> clean(){
        //1 创建条件构造器
        LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();

        //2 添加查询条件 -> 条件: 查询当前登录用户id所属的购物车数据
        wrapper.eq(ShoppingCart::getUserId,BaseContext.getCurrentId());

        //3 调用业务层方法完成购物车的清空
        shoppingCartService.remove(wrapper);

        //4 返回"清空购物车成功"的提示信息
        return R.success("清空购物车成功");
    }

    // 删除购物车数据 -> 购物车内套餐或菜品数量的减少
    @PostMapping("/sub")
    @Transactional
    public R<ShoppingCart> sub(@RequestBody ShoppingCart shoppingCart){
        Long currentId = BaseContext.getCurrentId();
        //1 获取菜品的id
        Long dishId = shoppingCart.getDishId();
        //2 获取套餐的id
        Long setmealId = shoppingCart.getSetmealId();
        //3 创建条件构造器
        LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();
        //4 判断购物车内菜品是否存在
        if (dishId != null){
            // 购物车内存在菜品,则通过dishId查询出菜品信息
            wrapper.eq(ShoppingCart::getDishId,dishId);
            // 关联当前登录用户 获取当前用户对应的购物车
            wrapper.eq(ShoppingCart::getUserId,currentId);
            ShoppingCart one = shoppingCartService.getOne(wrapper);
            one.setNumber(one.getNumber() - 1);
            Integer number = one.getNumber();
            // 对菜品的数量进行判断
            if (number > 0){
                // 则对数据进行更新-1操作
                shoppingCartService.updateById(one);
            }else if (number == 0){
                // 若购物车内菜品的数量为0,则将菜品从购物车内移除
                shoppingCartService.removeById(one.getId());
            }else if (number < 0){
                // 若购物车内菜品的数量小于0,则抛出异常
                throw new CustomException("数据错误,请重试");
            }
            // 判断完成,则返回结果
            return R.success(one);
        }
        //5 判断购物车内套餐是否存在
        if (setmealId != null){
            // 存在,则通过setmealId查询出套餐的具体信息
            wrapper.eq(ShoppingCart::getSetmealId,setmealId);
            // 关联当前登录用户 获取当前用户对应的购物车
            wrapper.eq(ShoppingCart::getUserId,currentId);
            ShoppingCart one1 = shoppingCartService.getOne(wrapper);
            one1.setNumber(one1.getNumber() - 1);
            Integer number = one1.getNumber();
            // 对购物车内套餐的数量进行判断
            if (number > 0){
                // 对数据进行更新
                shoppingCartService.updateById(one1);
            }else if (number == 0){
                // 若购物车内套餐的数量为0,则将改套餐从购物车内移除
                shoppingCartService.removeById(one1.getId());
            }else if (number < 0){
                // r若购物车内套餐的数量小于0,则抛出异常提示信息
                throw new CustomException("数据错误,请重试");
            }
            // 判断完成后,返回结果
            return R.success(one1);
        }
        return R.error("操作异常");
    }
}
